<!DOCTYPE html>
<html prefix="
og: http://ogp.me/ns#
article: http://ogp.me/ns/article#
" lang="zh_cn">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>使用python还是scala开发spark程序？ | vincent blog</title>
<link href="../../assets/css/all-nocdn.css" rel="stylesheet" type="text/css">
<link rel="alternate" type="application/rss+xml" title="RSS" href="../../rss.xml">
<link rel="canonical" href="https://wisonwang.github.io/posts/spark-with-python-or-scala/">
<!--[if lt IE 9]><script src="/assets/js/html5.js"></script><![endif]--><meta name="author" content="vincent wang">
<meta property="og:site_name" content="vincent blog">
<meta property="og:title" content="使用python还是scala开发spark程序？">
<meta property="og:url" content="https://wisonwang.github.io/posts/spark-with-python-or-scala/">
<meta property="og:description" content="spark 官方提供了python,java, scala,R 三种语言的封装，scala和java都建立jvm可以相互调用，R一般人用的不多，如下比较一下python
和scala开发spark程序的优缺点。



scala和python开发spark程序各自优点



pyspark优点


动态语言开发效率高，工程难度低
算法类库丰富，易于移移植现有算法到spark平台
工具支持丰富，包括">
<meta property="og:type" content="article">
<meta property="article:published_time" content="2018-04-17T16:16:02+08:00">
<meta property="article:tag" content="pyspark">
<meta property="article:tag" content="python">
<meta property="article:tag" content="scala">
<meta property="article:tag" content="spark">
</head>
<body>
    <section class="social"><ul>
<li><a href="../../index.html" title="Home"><i class="icon-home"></i></a></li>
            <li><a href="../../archive.html" title="文章存档"><i class="icon-archive"></i></a></li>
            <li><a href="../../categories/" title="标签"><i class="icon-tags"></i></a></li>
            <li><a href="../../pages/about" title="About"><i class="icon-about"></i></a></li>
            <li><a href="../../rss.xml" title="RSS 源"><i class="icon-rss"></i></a></li>
            <li><a href="https://twitter.com/wisonwang" title="My Twitter"><i class="icon-twitter"></i></a></li>
            <li><a href="https://github.com/wisonwang" title="My Github"><i class="icon-github"></i></a></li>

        </ul></section><section class="page-content"><div class="content" rel="main">
    <div class="post">
        <h1 class="p-name entry-title" itemprop="headline name">使用python还是scala开发spark程序？</h1>

        <div class="meta">
            <div class="authordate">
                <time class="timeago" datetime="2018-04-17T16:16:02+08:00">2018-04-17 16:16</time>
            
                      |  
        <a href="index.org" id="sourcelink">源代码</a>

            </div>
                    <div itemprop="keywords" class="tags">
        <ul>
        标签 : 
           <li><a class="tag p-category" href="../../categories/pyspark/" rel="tag">pyspark</a></li>
           <li><a class="tag p-category" href="../../categories/python/" rel="tag">python</a></li>
           <li><a class="tag p-category" href="../../categories/scala/" rel="tag">scala</a></li>
           <li><a class="tag p-category" href="../../categories/spark/" rel="tag">spark</a></li>
        </ul>
</div>

        </div>
        <div class="body">
            <p>
spark 官方提供了python,java, scala,R 三种语言的封装，scala和java都建立jvm可以相互调用，R一般人用的不多，如下比较一下python
和scala开发spark程序的优缺点。
</p>

<div id="outline-container-orgbaf403a" class="outline-2">
<h2 id="orgbaf403a">scala和python开发spark程序各自优点</h2>
<div class="outline-text-2" id="text-orgbaf403a">
</div>
<div id="outline-container-orgef7354b" class="outline-3">
<h3 id="orgef7354b">pyspark优点</h3>
<div class="outline-text-3" id="text-orgef7354b">
<ol class="org-ol">
<li>动态语言开发效率高，工程难度低</li>
<li>算法类库丰富，易于移移植现有算法到spark平台</li>
<li>工具支持丰富，包括jupyter notebook之类的工具，能够做到程序结果可视化，方便调优</li>
</ol>
</div>
</div>

<div id="outline-container-orgdd6c6cb" class="outline-3">
<h3 id="orgdd6c6cb">pyspark缺点</h3>
<div class="outline-text-3" id="text-orgdd6c6cb">
<ol class="org-ol">
<li>性能差： 动态语言载加上通过py4j来和spark交互的，在计算量很大的情况下慢的可怕；</li>
<li>不能使用全部spark api： 因为是通过py4j调用，需要必要的封装（pyspark），不能像scala那样和java可以直接调用， 导致不能直接调用java或者scala类库。</li>
</ol>
<!-- TEASER_END -->
</div>
</div>
</div>

<div id="outline-container-orgb161005" class="outline-2">
<h2 id="orgb161005">总结</h2>
<div class="outline-text-2" id="text-orgb161005">
<ol class="org-ol">
<li>对于算法实现的初步阶段可以使用python开发原型，配合一些工具进行快速评估，演示;</li>

<li>对于实施阶段，如果计算量大，有性能瓶颈，还是安心用scala吧。</li>
</ol>
</div>
</div>

<div id="outline-container-org9a91394" class="outline-2">
<h2 id="org9a91394">python 开发spark程序的一些问题</h2>
<div class="outline-text-2" id="text-org9a91394">
</div>
<div id="outline-container-orgf8a8a1a" class="outline-3">
<h3 id="orgf8a8a1a">python 依赖环境分发</h3>
<div class="outline-text-3" id="text-orgf8a8a1a">
<p>
用 Java 和 Scala 访问 Spark 提供了许多优点 : 因为 Spark 它自己运行在 JVM 中，运行在 JVM 内部是平台无关的，独立的代码包和它打入到 JAR 文件中的依赖，以及更高的性能。如果您使用 Spark Python API 将会失去这些优势。
</p>

<p>
管理依赖并让它们可用于群集上的 Python Job 是很难的。为了确定哪些依赖在群集上是需要的，您必须了解运行在分布式 群集 中的 Spark executor 进程中的 Spark 应用程序的代码。如果您定义的 Python 转换使用的任何的第三方库，比如 NumPy 或者 nltk，当它们运行在远程的 executor 上时 Spark executor 需要访问这些库。
</p>

<p>
主要可以通过以下方式，推荐第3种方法：
</p>

<ol class="org-ol">
<li>独立的依赖关系（单个文件，单个egg）（–py-files）</li>
<li>复杂的依赖关系（生成egg文件，然后使用–py-files）</li>
<li>设置 Python 路径(推荐)，打包python path</li>
</ol>
<p>
<a href="http://cwiki.apachecn.org/pages/viewpage.action?pageId=2886878">详细参考：运行 Spark Python 应用</a>
</p>
</div>
</div>
</div>
        </div>
                <ul class="pager hidden-print">
<li class="previous">
                <a href="../%E4%BD%BF%E7%94%A8nikola%2Bspacemacs%2Borgmode%20%E6%90%AD%E5%BB%BAblog/" rel="prev" title="使用nikola+spacemacs+orgmode 搭建blog">前一篇</a>
            </li>
            <li class="next">
                <a href="../scala_maven_to_sbt/" rel="next" title="scala_maven_to_sbt">后一篇</a>
            </li>
        </ul>
<div id="disqus_thread"></div>
        <script>
        var disqus_shortname ="wisonwanghomepage",
            disqus_url="https://wisonwang.github.io/posts/spark-with-python-or-scala/",
        disqus_title="\u4f7f\u7528python\u8fd8\u662fscala\u5f00\u53d1spark\u7a0b\u5e8f\uff1f",
        disqus_identifier="cache/posts/spark-with-python-or-scala.html",
        disqus_config = function () {
            this.language = "zh_cn";
        };
        (function() {
            var dsq = document.createElement('script'); dsq.async = true;
            dsq.src = 'https://' + disqus_shortname + '.disqus.com/embed.js';
            (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
        })();
    </script><noscript>Please enable JavaScript to view the <a href="https://disqus.com/?ref_noscript" rel="nofollow">comments powered by Disqus.</a>
</noscript>
    <a href="https://disqus.com" class="dsq-brlink" rel="nofollow">Comments powered by <span class="logo-disqus">Disqus</span></a>


    </div>
                     <footer id="footer"><p>Contents © 2020         <a href="mailto:fangfu2012@gmail.com">vincent wang</a> - Powered by         <a href="https://getnikola.com" rel="nofollow">Nikola</a>         </p>
            
        </footer>
</div>
    </section><script src="../../assets/js/all-nocdn.js" type="text/javascript"></script><script type="text/javascript" src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"> </script><script type="text/x-mathjax-config">
    MathJax.Hub.Config({tex2jax: {inlineMath: [['$latex ','$'], ['\\(','\\)']]}});
    </script><script type="text/javascript">
            $(function(){
                $('.timeago').timeago();
            });
        </script>
</body>
</html>
